package com.lyt.springboot.designPattern.observerPattern;

// 测试类
public class ObserverPatternDemo {
    public static void main(String[] args) {
        // 创建指挥官
        Commander commander = new Commander();

        // 创建士兵并注册为观察者
        Soldier soldier1 = new Soldier("Soldier A");
        Soldier soldier2 = new Soldier("Soldier B");
        commander.addObserver(soldier1);
        commander.addObserver(soldier2);

        // 下达命令
        commander.notifyObservers("Advance!");

        // 移除一个士兵观察者
        commander.removeObserver(soldier1);

        // 再次下达命令
        commander.notifyObservers("Retreat!");
    }
    /**
     * 上面的例子中，观察者模式的核心体现主要体现在以下几个方面：
     *
     * 主题（Subject）与观察者（Observer）的分离：
     * Commander类作为主题（Subject），它维护了一个观察者列表，并不关心具体观察者的行为。
     * Soldier类作为观察者（Observer），它实现了Observer接口，并定义了当接收到通知时应该执行的操作。
     * 动态注册与注销观察者：
     * 通过addObserver方法，可以将新的观察者动态地添加到主题的观察者列表中。
     * 通过removeObserver方法，可以从主题的观察者列表中移除某个观察者。
     * 一对多的依赖关系：
     * 一个Commander对象可以有多个Soldier对象作为观察者。当Commander的状态（在这里体现为下达的命令）发生变化时，它会通知所有注册的观察者。
     * 通知机制：
     * 当Commander下达命令时，它会调用notifyObservers方法，遍历观察者列表，并调用每个观察者的update方法，将命令作为参数传递过去。
     * 观察者（Soldier）在接收到通知后，会根据命令执行相应的操作。
     * 松耦合：
     * 主题和观察者之间通过接口进行交互，这使得它们可以独立地改变而不会相互影响。例如，可以在不修改Commander类的情况下添加新的观察者类型。
     * 广播通信：
     * 当主题状态变化时，它会通知所有注册的观察者，而不是单个特定的观察者。这体现了观察者模式中的广播通信特性。
     */
}